﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Win32;
using System.Text.RegularExpressions;
using System.IO;
using System.Collections;
using System.Data.OleDb;
using System.Data;

namespace CDTM.Modules.TraCuuDiem.Components
{
    public class Global
    {
        public struct ExcelTemplate
        {
            public string TemplateFileName;
            public string TemplateFolder;
            public string ExportFolder;
            public string ExportFolderPath;
            public string TemplateFileFullPath;
        }

        public enum LogType
        {
            Import,
            Export
        }

        public enum TraCuuDiemType
        {
            DiemTuyenSinh,
            DiemTotNghiep,
            DiemTotNghiepCaoDang,
            DiemTotNghiepTrungCap,
            KetQuaHocTap,
            KetQuaRenLuyen,
            TaoMatKhau,
            PhucHoiMatKhau
        }

        #region Điểm tuyển sinh
        /// <summary>
        /// Quy định tổng số cột trong mẫu file Excel.
        /// </summary>
        public const int TUYENSINH_COLUMN_COUNT = 18;

        /// <summary>
        /// Quy định vị trí dòng bắt đầu lấy dữ liệu trong mẫu file Excel.
        /// </summary>
        public const int TUYENSINH_ROW_POSITION_GETVALUE = 5;

        /// <summary>
        /// Vị trí index tên cột tương ứng trên file Excel. Vị trí Cột thứ nhất bắt đầu có giá trị là 0 trong Excel.
        /// </summary>
        public enum TuyenSinhColumnIndex
        {
            SBD = 1,
            BTS = 5,
            DonVi = 6,
            MHS = 7,
            HoTenLot = 3,
            Ten = 4,
            NgaySinh = 9,
            GioiTinh = 8,
            Tinh = 10,
            Huyen = 11,
            DoiTuong = 12,
            UuTien = 13,
            KhuVuc = 14,
            Mon1 = 15,//Toan
            Mon2 = 16,//Ly
            Mon3 = 17,//Hoa
            Tong = 18,
            ChuyenNganh = 19
        }
        #endregion

        #region Kết quả rèn luyện
        /// <summary>
        /// Quy định tổng số cột trong mẫu file Excel.
        /// </summary>
        public const int RENLUYEN_COLUMN_COUNT = 19;

        /// <summary>
        /// Quy định vị trí dòng bắt đầu lấy dữ liệu trong mẫu file Excel.
        /// </summary>
        public const int RENLUYEN_ROW_POSITION_GETVALUE = 7;

        /// <summary>
        /// Vị trí index tên cột tương ứng trên file Excel. Vị trí Cột thứ nhất bắt đầu có giá trị là 0 trong Excel.
        /// </summary>
        public enum RenLuyenColumnIndex
        {
            MaSV = 1,
            HoTen = 2,
            Ten = 3,
            Lop = 4,
            NgaySinh = 5,
            XepLoaiHT = 6,
            YTHT_1 = 7,//KetQua
            YTHT_2 = 8,//ChuyenCan
            YTHT_3 = 9,//NCKH
            CHNQ_1 = 10,//Tong
            CHNQ_2 = 11,//The
            CHNQ_3 = 12,//ChaoCo
            CHNQ_4 = 13,//QuyChe
            TGHDXH = 14,//ThamGiaHDXH
            PCCD_1 = 15,//PhamChatCongDan
            PCCD_2 = 16,//QuanHeCongDong
            PTLDT = 17,//PhuTrachLop
            DiemTK = 18,//DiemTongKet
            XepLoai = 19,//XepLoai
            GhiChu = 20
        }
        #endregion

        #region Kết quả học tập
        /// <summary>
        /// Quy định tổng số cột trong mẫu file Excel.
        /// </summary>
        public const int HOCTAP_COLUMN_COUNT = 20;

        /// <summary>
        /// Quy định vị trí dòng bắt đầu lấy dữ liệu trong mẫu file Excel.
        /// </summary>
        public const int HOCTAP_ROW_POSITION_GETVALUE = 8;

        /// <summary>
        /// Vị trí index tên cột tương ứng trên file Excel. Vị trí Cột thứ nhất bắt đầu có giá trị là 0 trong Excel.
        /// </summary>
        public enum HocTapColumnIndex
        {
            MaSV = 1,
            HoTenLot = 2,
            Ten = 3,
            Lop = 4,
            HT_TBC = 5,
            HT_XepLoai = 6,
            RL_TDiem = 7,
            RL_XepLoai = 8,
            Mon1 = 9,
            Mon2 = 10,
            Mon3 = 11,
            Mon4 = 12,
            Mon5 = 13,
            Mon6 = 14,
            Mon7 = 15,
            Mon8 = 16,
            Mon9 = 17,
            DHTDNH = 25
        }
        #endregion

        #region Điểm tốt nghiệp Trung cấp
        /// <summary>
        /// Quy định tổng số cột trong mẫu file Excel.
        /// </summary>
        public const int TOTNGHIEP_TC_COLUMN_COUNT = 15;

        /// <summary>
        /// Quy định vị trí dòng bắt đầu lấy dữ liệu trong mẫu file Excel.
        /// </summary>
        public const int TOTNGHIEP_TC_ROW_POSITION_GETVALUE = 10;

        /// <summary>
        /// Vị trí index tên cột tương ứng trên file Excel. Vị trí Cột thứ nhất bắt đầu có giá trị là 0 trong Excel.
        /// </summary>
        public enum TotNghiepTrungCapColumnIndex
        {
            MaSV = 1,
            HoTenLot = 2,
            Ten = 3,
            NgaySinh = 4,
            Lop = 5,
            DiemTBCTK = 6,
            KyLuat = 7,
            MontTN_ChinhTri = 8,
            MonTN_LyThuyet = 9,
            MonTN_ThucHanh = 10,
            DTB_TotNghiep = 11,
            DXL_TotNghiep = 12,
            TyLeDVHPTL = 13,
            CongNhanTN = 14,
            XepLoaiTN = 15,
            GhiChu = 16
        }
        #endregion

        #region Điểm tốt nghiệp Cao đẳng
        /// <summary>
        /// Quy định tổng số cột trong mẫu file Excel.
        /// </summary>
        public const int TOTNGHIEP_CD_COLUMN_COUNT = 14;

        /// <summary>
        /// Quy định vị trí dòng bắt đầu lấy dữ liệu trong mẫu file Excel.
        /// </summary>
        public const int TOTNGHIEP_CD_ROW_POSITION_GETVALUE = 10;

        /// <summary>
        /// Vị trí index tên cột tương ứng trên file Excel. Vị trí Cột thứ nhất bắt đầu có giá trị là 0 trong Excel.
        /// </summary>
        public enum TotNghiepCaoDangColumnIndex
        {
            MaSV = 1,
            HoTenLot = 2,
            Ten = 3,
            Lop = 4,
            Kyluat = 5,
            GDQP = 6,
            GDTC = 7,
            TTHCM = 8,
            MonTNCS = 9,
            MonTNCN = 10,
            DTNCTK = 11,
            TLDVHPThiLai = 12,
            CongNhanTN = 13,
            XLTN = 14,
            GhiChu = 15
        }
        #endregion

        public static bool CreateFolder(string folderName)
        {
            bool valid = false;

            try
            {
                if (!System.IO.Directory.Exists(folderName))
                {
                    System.IO.Directory.CreateDirectory(folderName);
                }
                valid = true;
            }
            catch (Exception ex) { valid = false; throw ex; }

            return valid;
        }

        public static bool IsReadOnly(string fileName)
        {
            System.IO.FileInfo f = new System.IO.FileInfo(fileName);

            return f.IsReadOnly;
        }

        public static string GetExtension(string fileName)
        {
            return System.IO.Path.GetExtension(fileName).ToUpper();
        }

        public static string RemoveAccents(string input)
        {
            Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");

            string strFormD = input.Normalize(System.Text.NormalizationForm.FormD);
            string str = regex.Replace(strFormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');
            return str = str.Replace(" ", "");
        }

        public static void StopExcel()
        {
            try
            {
                System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
                foreach (System.Diagnostics.Process p in ps)
                {
                    if (p.ProcessName.ToLower().Equals("excel"))
                        p.Kill();
                }
            }
            catch { }
        }

        /// <summary>
        /// Checks whether MS Excel is installed on the computer.TMKC.070906
        /// </summary>
        /// <returns></returns>
        private static bool Excel_IsInstalled()
        {
            //Checks whether MS Excel is installed on the computer,
            //by searching the HKEY_CLASSES_ROOT\Excel.Application key            
            bool bInstalled = false;
            RegistryKey aRegKey = null;
            try
            {
                aRegKey = Registry.ClassesRoot.OpenSubKey("Excel.Application");
                bInstalled = (aRegKey != null);
            }
            catch
            {
                bInstalled = false;
            }
            finally
            {
                if (aRegKey != null)
                    aRegKey.Close();
            }
            return bInstalled;
        }

        public static bool CheckMSExcel()
        {
            if (!Excel_IsInstalled())
            {
                return false; //"MS Excel chưa được cài đặt trên máy tính!"
            }
            else
                return true;
        }

        public static string GetExcelIndexToLetter(int i)
        {
            string[] excelmap = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
								 "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ"};

            return excelmap[i];
        }

        public static string ConvertGender(bool isNam)
        {
            if (isNam)
                return "";
            else
                return "Nữ";
        }

        /****************************IMPORT/ EXPORT********************************/
        /// <summary>
        /// Kiểm tra file hợp lệ: 
        /// - Đã chọn file chưa?.
        /// - File đúng định dạng loại file *.xls?.
        /// - Kích thước file quá lớn, vượt quá quy định?.
        /// </summary>
        /// <param name="file">Control FileUpload</param>
        /// <param name="message">Control Label dùng hiển thị thông báo.</param>
        /// <returns></returns>
        /// Author: HungTQ, Date created: 03/17/2010.
        public static bool ValidateFile(System.Web.UI.WebControls.FileUpload file, System.Web.UI.WebControls.Label message)
        {
            bool valid = true;

            message.Text = "";

            if (file.HasFile == false)
            {
                message.Text = "Chưa chọn tệp tin.";
                valid = false;
            }
            else
            {
                string ext = System.IO.Path.GetExtension(file.PostedFile.FileName).ToUpper();
                //Kiểm tra định dạng file.                
                if (ext == ".XLS" || ext == ".XLSX")
                { }
                else
                {
                    message.Text = "Tệp tin không đúng định dạng yêu cầu. Chỉ cho phép duy nhất tệp tin 'Excel'.";
                    valid = false;
                }
            }

            return valid;
        }

        /// <summary>
        /// Tải file lên Server và lưu vào thư mục 'UPLOAD'.
        /// </summary>
        /// <param name="file">Control FileUpload</param>
        /// <param name="message">Control Label dùng hiển thị thông báo.</param>
        /// <param name="storageType">Kiểu lưu file: 'DATABASE/ FILE'.</param>
        /// <param name="folderName">Tên thư mục lưu file. Nếu '' mặc định lấy tên 'EXCEL'.</param>
        /// <param name="isOverwrite">Xác định ghi đè file nếu tồn tại. Ngược lại sẽ tự động tạo 1 bản sao và đổi tên.</param>
        /// <returns></returns>
        /// Author: HungTQ, Date created: 03/17/2010.
        public static string UploadFile(System.Web.UI.WebControls.FileUpload file,
            System.Web.UI.WebControls.Label message, string storageType, string folderName, bool isOverwrite)
        {
            string fileUrl = string.Empty;
            string physicalDirectory = "";
            string physicalPath = "";

            try
            {
                // Initialize variables
                string sSavePath = "";

                // Set constant values
                if (folderName == "")
                    sSavePath = "Uploads\\EXCEL";
                else
                    sSavePath = "Uploads\\" + folderName;

                // If file field isn’t empty
                if (file.PostedFile != null)
                {
                    // Check file size (mustn’t be 0)
                    int fileSize = file.PostedFile.ContentLength;
                    if (fileSize == 0)
                    {
                        message.Text = "Tệp tin này không có dữ liệu.";
                        return "";
                    }

                    //Create folder if not exists.
                    physicalDirectory = HttpRuntime.AppDomainAppPath + sSavePath;
                    if (!CreateFolder(physicalDirectory))
                    {
                        message.Text = "Lỗi trong quá trình thực thi tạo thư mục '" + physicalDirectory + "'.";
                        return "";
                    }

                    // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an 
                    // incremental numeric until it is unique
                    string sFilename = System.IO.Path.GetFileName(file.PostedFile.FileName);

                    //Chuyển đổi các ký tự Unicode -> ASCII.
                    sFilename = RemoveAccents(sFilename);

                    physicalPath = physicalDirectory + "\\" + sFilename;

                    //Kiểm tra trùng lặp file?                
                    if (isOverwrite == false)//Không ghi đè
                    {
                        int file_append = 1;
                        while (System.IO.File.Exists(physicalPath))
                        {
                            physicalPath = physicalDirectory + "\\" + file_append + "_" + sFilename;
                            file_append++;
                        }
                    }

                    /*
                    //Lưu file
                    // Read file into a data stream
                    byte[] myData = new Byte[fileSize];
                    file.PostedFile.InputStream.Read(myData, 0, fileSize);
                    // Save the stream to disk
                    System.IO.FileStream newFile = new System.IO.FileStream(physicalPath, System.IO.FileMode.Create);
                    newFile.Write(myData, 0, myData.Length);
                    newFile.Close();
                    */

                    //Lưu file
                    FileInfo fi = new FileInfo(physicalPath);
                    try
                    {
                        file.SaveAs(physicalPath);
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.Contains("denied"))
                            message.Text = "ReadOnly - Không thể lưu file '" + physicalPath + "'. \n";
                        else
                            message.Text = "Lỗi trong quá trình thực thi lưu file '" + physicalPath + "'.";
                        return "";
                    }
                    fileUrl = "~/Uploads/" + folderName + "/" + fi.Name;
                }
            }
            catch (ArgumentException errArgument)
            {
                // The file wasn't a valid jpg file

                message.Text = "Tệp tin không hợp lệ.";
                System.IO.File.Delete(physicalPath);
                return "";
            }

            return fileUrl;
        }

        public static bool CheckSchema(string sExcelFileName, string sSheetName, System.Web.UI.WebControls.Label message, TraCuuDiemType type)
        {
            bool valid = true;

            switch (type)
            {
                case TraCuuDiemType.DiemTuyenSinh:
                    valid = CheckSchema(sExcelFileName, sSheetName, message) >= Global.TUYENSINH_COLUMN_COUNT;
                    break;
                case TraCuuDiemType.DiemTotNghiepCaoDang:
                    valid = CheckSchema(sExcelFileName, sSheetName, message) >= Global.TOTNGHIEP_CD_COLUMN_COUNT;
                    break;
                case TraCuuDiemType.DiemTotNghiepTrungCap:
                    valid = CheckSchema(sExcelFileName, sSheetName, message) >= Global.TOTNGHIEP_TC_COLUMN_COUNT;
                    break;
                case TraCuuDiemType.KetQuaHocTap:
                    valid = CheckSchema(sExcelFileName, sSheetName, message) >= Global.HOCTAP_COLUMN_COUNT;
                    break;
                case TraCuuDiemType.KetQuaRenLuyen:
                    valid = CheckSchema(sExcelFileName, sSheetName, message) >= Global.RENLUYEN_COLUMN_COUNT;
                    break;
            }

            if (valid == false)
                message.Text = "Biểu mẫu '" + sSheetName +
                                           "' không hợp lệ. Có thể số cột dữ liệu không đúng theo mẫu quy định. ";

            return valid;
        }

        /// <summary>
        /// Lấy số cột của Sheet để kiểm tra có đúng file Mẫu.
        /// </summary>
        /// <param name="sExcelFileName"></param>
        /// <param name="sSheetName"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        private static int CheckSchema(string sExcelFileName, string sSheetName, System.Web.UI.WebControls.Label message)
        {
            try
            {
                OleDbConnection cnCSV = GetConnection(sExcelFileName);

                cnCSV.Open();

                OleDbCommand cmdSelect = new OleDbCommand(@"SELECT * FROM [" + sSheetName + "$]",
                                                          cnCSV);
                OleDbDataReader reader = cmdSelect.ExecuteReader();

                int count = reader.FieldCount;

                cnCSV.Close();

                return count;
            }
            catch (Exception ex)
            {
                if (!SheetNameIsValid(sSheetName))
                    message.Text = "Không mở được Sheet '" + sSheetName +
                                           "'. Tên Sheet không phù hợp để xử lý. " +
                                           "Xin vui lòng đặt lại tên (không có tiếng Việt và không chứa các ký tự đặc biệt như khoảng trắng, -, @,...). Sau đó, bạn có thể import lại.";
                else
                    message.Text = "Không mở được Sheet '" + sSheetName +
                                           "'. Có thể định dạng dữ liệu của Sheet không phù hợp. ";
                return 0;
            }
            finally { }
        }

        private static OleDbConnection GetConnection(string sExcelFileName)
        {
            string strConnectionString = string.Empty;
            string ext = GetExtension(sExcelFileName);

            if (ext == ".XLS")
                strConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                                       + sExcelFileName
                                       + @";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
            else if (ext == ".XLSX")
                strConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                                       + sExcelFileName
                                       + @";Extended Properties=""Excel 12.0 Xml;HDR=YES""";

            //If you are using Excel 97 set Extended roperties to 8 
            //if using Excel 2000 set it to 9
            OleDbConnection cnCSV = new OleDbConnection(strConnectionString);
            return cnCSV;
        }

        private static string FixSheetName(string sSheetName)
        {
            string sRet = sSheetName;
            if (!String.IsNullOrEmpty(sSheetName))
            {
                //Xóa các ký tự '
                sRet = sSheetName.Replace("'", "");

                //Tìm kí tự $ trong tên Sheet
                int iLastIndex = sRet.LastIndexOf("$");
                if (iLastIndex != -1)//Tìm thấy, loại bỏ đoạn từ $ về cuối string
                    sRet = sRet.Substring(0, iLastIndex);
            }
            return sRet;
        }

        private static bool SheetNameIsValid(string sSheetName)
        {
            bool bIsValid = true;
            if (!string.IsNullOrEmpty(sSheetName))
            {
                const string sVALID_CHARS_LISTING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
                //Có thể dùng char.IsLetterOrDigit()
                foreach (char chr in sSheetName)
                    if (sVALID_CHARS_LISTING.IndexOf(chr) == -1) // not in
                    {
                        bIsValid = false;
                        break;
                    }
            }
            else
                bIsValid = false;

            return bIsValid;
        }

        /// <summary>
        /// Lấy danh sách tên các WookSheet.
        /// </summary>
        /// <param name="sExcelFileName"></param>
        /// <returns></returns>
        public static ArrayList GetSheetNameList(string sExcelFileName, System.Web.UI.WebControls.Label message)
        {
            ArrayList list = new ArrayList();

            OleDbConnection cnCSV = GetConnection(sExcelFileName);

            try
            {
                cnCSV.Open();

                DataTable aDataTable = cnCSV.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                                                 new object[] { null, null, null, "TABLE" });

                if (aDataTable != null)
                {
                    string sSheetName = string.Empty;
                    foreach (DataRow aDataRow in aDataTable.Rows)
                    {
                        // Kiểm tra và tìm tên Sheet không có dấu '#'. Lấy tên Sheet đầu tiên nếu thõa điều kiện. 
                        // File Excel 2007 có các Sheet có ký hiệu lạ như: "_xlhm#..." -> không lấy sheet này.
                        sSheetName = aDataRow["TABLE_NAME"].ToString();

                        if (sSheetName.IndexOf('#') != -1)
                            continue;

                        sSheetName = FixSheetName(aDataRow["TABLE_NAME"].ToString());

                        list.Add(sSheetName);
                    }
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("Could not decrypt file"))
                    message.Text = "Lỗi mở tập tin, Tập tin đã được bảo vệ bằng mật khẩu. Xin vui lòng gỡ bỏ mật khẩu trước khi Import!";
                else if (ex.Message.Contains("External table is not in the expected format."))
                    message.Text = "Lỗi mở tập tin, Tập tin có cấu trúc định dạng thông tin không đúng. Xin vui lòng kiểm tra lại trước khi Import!. \n<i>Cách khắc phục: Sao chép cấu trúc và dữ liệu sang 1 file mới, gõ bỏ các cột ẩn.</i>";
                else
                    message.Text = ex.StackTrace;
            }
            finally
            {
                if (cnCSV != null)
                    cnCSV.Close();
            }
            return list;
        }

        /// <summary>
        /// Lấy dữ liệu của Sheet.
        /// </summary>
        /// <param name="sExcelFileName"></param>
        /// <param name="sSheetName"></param>
        /// <returns></returns>
        public static DataTable GetDataFromXLS(string sExcelFileName, string sSheetName)
        {
            try
            {
                string strConnectionString = string.Empty;

                OleDbConnection cnCSV = GetConnection(sExcelFileName);

                cnCSV.Open();

                OleDbCommand cmdSelect = new OleDbCommand(@"SELECT * FROM [" + sSheetName + "$]",
                                                          cnCSV);
                OleDbDataAdapter daCSV = new OleDbDataAdapter();
                daCSV.SelectCommand = cmdSelect;
                DataTable dtCSV = new DataTable();
                daCSV.Fill(dtCSV);

                cnCSV.Close();
                daCSV = null;

                return dtCSV;
            }
            catch (Exception ex)
            {

                return null;
            }
            finally { }
        }

        /// <summary>
        /// Đọc một Sheet và hiển thị nó.
        /// </summary>
        /// <param name="objExcelSheet">Worksheet được hiển thị</param>
        /// <param name="lblErrText">Hiển thị bất kỳ lỗi nào xảy ra.</param>
        /// <returns>Trả về giá trị Control chứa thông tin của Worksheet</returns>
        public static List<TuyenSinh> ExcelSheetReadTuyenSinh(DataTable tableSheet, int posRowGetRowValue, out List<LogDetail> logDetails)
        {
            logDetails = new List<LogDetail>();

            List<TuyenSinh> listTuyenSinh = new List<TuyenSinh>();

            TuyenSinh objTuyenSinh = null;

            if (tableSheet == null)
            {
                return listTuyenSinh;
            }

            //Lưu ý: Vị trí dòng lấy dữ liệu - 1.
            //Lý do vì khi load dữ liệu từ file Excel vào DataTable, thông tin dòng đầu tiên trong file Excel 
            //được lấy làm tên tiêu đề cột trong Table nên trừ - 1 để lấy vị trí cho chính xác.
            int posGetValue = posRowGetRowValue - 1;

            int nMaxCol = tableSheet.Columns.Count;
            int nMaxRow = tableSheet.Rows.Count;

            try
            {
                //Duyệt row bắt đầu từ vị trí lấy dữ liệu.
                //Do trên DataTable vị trí duyệt bắt đẩu từ index 0 nên - 1.
                //Nếu vị trí duyệt bắt đẩu từ index 1 thì nRowIndex <= nMaxRow.
                for (int nRowIndex = posGetValue - 1; nRowIndex < nMaxRow; nRowIndex++)
                {
                    objTuyenSinh = new TuyenSinh();

                    //Duyệt column bắt đầu từ vị trí đầu tiên
                    for (int nColIndex = 0; nColIndex < nMaxCol; nColIndex++)
                    {
                        //Lấy dữ liệu
                        if (tableSheet.Rows[nRowIndex][nColIndex] != null)
                        {
                            //Lấy tên cột tương ứng giữa File Excel & Table Tuyển sinh
                            string columnName = ((Global.TuyenSinhColumnIndex)nColIndex).ToString();

                            try
                            {
                                UpdateValueTuyenSinh(objTuyenSinh, columnName, tableSheet.Rows[nRowIndex][nColIndex]);
                            }
                            catch (Exception ex)
                            {
                                //Lưu thông tin lỗi
                                LogDetail log = new LogDetail();
                                log.ColumnName = columnName;
                                log.RowPosition = nRowIndex + 2;
                                log.Description = "Giá trị lỗi: " + tableSheet.Rows[nRowIndex][nColIndex].ToString() + ". " + ex.Message;
                                logDetails.Add(log);
                            }
                        }
                    }

                    objTuyenSinh.HoKhau = string.Empty;
                    listTuyenSinh.Add(objTuyenSinh);
                }
            }
            catch (Exception ex)
            {

            }

            //Xóa các dữ liệu rác, rỗng.
            listTuyenSinh = TuyenSinh.Clean(listTuyenSinh);

            return listTuyenSinh;
        }

        /// <summary>
        /// Đọc một Sheet và hiển thị nó.
        /// </summary>
        /// <param name="objExcelSheet">Worksheet được hiển thị</param>
        /// <param name="lblErrText">Hiển thị bất kỳ lỗi nào xảy ra.</param>
        /// <returns>Trả về giá trị Control chứa thông tin của Worksheet</returns>
        public static List<RenLuyen> ExcelSheetReadRenLuyen(DataTable tableSheet, int posRowGetRowValue, out List<LogDetail> logDetails)
        {
            logDetails = new List<LogDetail>();

            List<RenLuyen> listRenLuyen = new List<RenLuyen>();

            RenLuyen objRenLuyen = null;

            if (tableSheet == null)
            {
                return listRenLuyen;
            }

            //Lưu ý: Vị trí dòng lấy dữ liệu - 1.
            //Lý do vì khi load dữ liệu từ file Excel vào DataTable, thông tin dòng đầu tiên trong file Excel 
            //được lấy làm tên tiêu đề cột trong Table nên trừ - 1 để lấy vị trí cho chính xác.
            int posGetValue = posRowGetRowValue - 1;

            int nMaxCol = tableSheet.Columns.Count;
            int nMaxRow = tableSheet.Rows.Count;

            try
            {
                //Duyệt row bắt đầu từ vị trí lấy dữ liệu.
                //Do trên DataTable vị trí duyệt bắt đẩu từ index 0 nên - 1.
                //Nếu vị trí duyệt bắt đẩu từ index 1 thì nRowIndex <= nMaxRow.
                for (int nRowIndex = posGetValue - 1; nRowIndex < nMaxRow; nRowIndex++)
                {
                    objRenLuyen = new RenLuyen();

                    //Duyệt column bắt đầu từ vị trí đầu tiên
                    for (int nColIndex = 0; nColIndex < nMaxCol; nColIndex++)
                    {
                        //Lấy dữ liệu
                        if (tableSheet.Rows[nRowIndex][nColIndex] != null)
                        {
                            //Lấy tên cột tương ứng giữa File Excel & Table Tuyển sinh
                            string columnName = ((Global.RenLuyenColumnIndex)nColIndex).ToString();

                            try
                            {
                                UpdateValueRenLuyen(objRenLuyen, columnName, tableSheet.Rows[nRowIndex][nColIndex]);
                            }
                            catch (Exception ex)
                            {
                                //Lưu thông tin lỗi
                                LogDetail log = new LogDetail();
                                log.ColumnName = columnName;
                                log.RowPosition = nRowIndex + 2;
                                log.Description = "Giá trị lỗi: " + tableSheet.Rows[nRowIndex][nColIndex].ToString() + ". " + ex.Message;
                                logDetails.Add(log);
                            }
                        }
                    }

                    listRenLuyen.Add(objRenLuyen);
                }
            }
            catch (Exception ex)
            {

            }

            //Xóa các dữ liệu rác, rỗng.
            listRenLuyen = RenLuyen.Clean(listRenLuyen);

            return listRenLuyen;
        }

        /// <summary>
        /// Đọc một Sheet và hiển thị nó.
        /// </summary>
        /// <param name="objExcelSheet">Worksheet được hiển thị</param>
        /// <param name="lblErrText">Hiển thị bất kỳ lỗi nào xảy ra.</param>
        /// <returns>Trả về giá trị Control chứa thông tin của Worksheet</returns>
        public static List<KQHocTap> ExcelSheetReadHocTap(DataTable tableSheet, int posRowGetRowValue, out List<LogDetail> logDetails)
        {
            logDetails = new List<LogDetail>();

            List<KQHocTap> listKQHocTap = new List<KQHocTap>();

            KQHocTap objKQHocTap = null;

            if (tableSheet == null)
            {
                return listKQHocTap;
            }

            //Lưu ý: Vị trí dòng lấy dữ liệu - 1.
            //Lý do vì khi load dữ liệu từ file Excel vào DataTable, thông tin dòng đầu tiên trong file Excel 
            //được lấy làm tên tiêu đề cột trong Table nên trừ - 1 để lấy vị trí cho chính xác.
            int posGetValue = posRowGetRowValue - 1;

            int nMaxCol = tableSheet.Columns.Count;
            int nMaxRow = tableSheet.Rows.Count;

            try
            {
                //Duyệt row bắt đầu từ vị trí lấy dữ liệu.
                //Do trên DataTable vị trí duyệt bắt đẩu từ index 0 nên - 1.
                //Nếu vị trí duyệt bắt đẩu từ index 1 thì nRowIndex <= nMaxRow.
                for (int nRowIndex = posGetValue - 1; nRowIndex < nMaxRow; nRowIndex++)
                {
                    objKQHocTap = new KQHocTap();

                    //Duyệt column bắt đầu từ vị trí đầu tiên
                    for (int nColIndex = 0; nColIndex < nMaxCol; nColIndex++)
                    {
                        //Lấy dữ liệu
                        if (tableSheet.Rows[nRowIndex][nColIndex] != null)
                        {
                            //Lấy tên cột tương ứng giữa File Excel & Table Tuyển sinh
                            string columnName = ((Global.HocTapColumnIndex)nColIndex).ToString();

                            try
                            {
                                UpdateValueHocTap(objKQHocTap, columnName, tableSheet.Rows[nRowIndex][nColIndex]);
                            }
                            catch (Exception ex)
                            {
                                //Lưu thông tin lỗi
                                LogDetail log = new LogDetail();
                                log.ColumnName = columnName;
                                log.RowPosition = nRowIndex + 2;
                                log.Description = "Giá trị lỗi: " + tableSheet.Rows[nRowIndex][nColIndex].ToString() + ". " + ex.Message;
                                logDetails.Add(log);
                            }
                        }
                    }

                    listKQHocTap.Add(objKQHocTap);
                }
            }
            catch (Exception ex)
            {

            }

            //Xóa các dữ liệu rác, rỗng.
            listKQHocTap = KQHocTap.Clean(listKQHocTap);

            return listKQHocTap;
        }

        /// <summary>
        /// Đọc một Sheet và hiển thị nó.
        /// </summary>
        /// <param name="objExcelSheet">Worksheet được hiển thị</param>
        /// <param name="lblErrText">Hiển thị bất kỳ lỗi nào xảy ra.</param>
        /// <returns>Trả về giá trị Control chứa thông tin của Worksheet</returns>
        public static List<TotNghiepCD> ExcelSheetReadTotNghiepCD(DataTable tableSheet, int posRowGetRowValue, out List<LogDetail> logDetails)
        {
            logDetails = new List<LogDetail>();

            List<TotNghiepCD> listTotNghiepCD = new List<TotNghiepCD>();

            TotNghiepCD objTotNghiepCD = null;

            if (tableSheet == null)
            {
                return listTotNghiepCD;
            }

            //Lưu ý: Vị trí dòng lấy dữ liệu - 1.
            //Lý do vì khi load dữ liệu từ file Excel vào DataTable, thông tin dòng đầu tiên trong file Excel 
            //được lấy làm tên tiêu đề cột trong Table nên trừ - 1 để lấy vị trí cho chính xác.
            int posGetValue = posRowGetRowValue - 1;

            int nMaxCol = tableSheet.Columns.Count;
            int nMaxRow = tableSheet.Rows.Count;

            try
            {
                //Duyệt row bắt đầu từ vị trí lấy dữ liệu.
                //Do trên DataTable vị trí duyệt bắt đẩu từ index 0 nên - 1.
                //Nếu vị trí duyệt bắt đẩu từ index 1 thì nRowIndex <= nMaxRow.
                for (int nRowIndex = posGetValue - 1; nRowIndex < nMaxRow; nRowIndex++)
                {
                    objTotNghiepCD = new TotNghiepCD();

                    //Duyệt column bắt đầu từ vị trí đầu tiên
                    for (int nColIndex = 0; nColIndex < nMaxCol; nColIndex++)
                    {
                        //Lấy dữ liệu
                        if (tableSheet.Rows[nRowIndex][nColIndex] != null)
                        {
                            //Lấy tên cột tương ứng giữa File Excel & Table Tuyển sinh
                            string columnName = ((Global.TotNghiepCaoDangColumnIndex)nColIndex).ToString();

                            try
                            {
                                UpdateValueTotNghiepCD(objTotNghiepCD, columnName, tableSheet.Rows[nRowIndex][nColIndex]);
                            }
                            catch (Exception ex)
                            {
                                //Lưu thông tin lỗi
                                LogDetail log = new LogDetail();
                                log.ColumnName = columnName;
                                log.RowPosition = nRowIndex + 2;
                                log.Description = "Giá trị lỗi: " + tableSheet.Rows[nRowIndex][nColIndex].ToString() + ". " + ex.Message;

                                logDetails.Add(log);
                            }
                        }
                    }

                    listTotNghiepCD.Add(objTotNghiepCD);
                }
            }
            catch (Exception ex)
            {

            }

            //Xóa các dữ liệu rác, rỗng.
            //listTotNghiepCD = TotNghiepCD.Clean(listTotNghiepCD);

            return listTotNghiepCD;
        }

        /// <summary>
        /// Đọc một Sheet và hiển thị nó.
        /// </summary>
        /// <param name="objExcelSheet">Worksheet được hiển thị</param>
        /// <param name="lblErrText">Hiển thị bất kỳ lỗi nào xảy ra.</param>
        /// <returns>Trả về giá trị Control chứa thông tin của Worksheet</returns>
        public static List<TotNghiepTC> ExcelSheetReadTotNghiepTC(DataTable tableSheet, int posRowGetRowValue, out List<LogDetail> logDetails)
        {
            logDetails = new List<LogDetail>();

            List<TotNghiepTC> listTotNghiepTC = new List<TotNghiepTC>();

            TotNghiepTC objTotNghiepTC = null;

            if (tableSheet == null)
            {
                return listTotNghiepTC;
            }

            //Lưu ý: Vị trí dòng lấy dữ liệu - 1.
            //Lý do vì khi load dữ liệu từ file Excel vào DataTable, thông tin dòng đầu tiên trong file Excel 
            //được lấy làm tên tiêu đề cột trong Table nên trừ - 1 để lấy vị trí cho chính xác.
            int posGetValue = posRowGetRowValue - 1;

            int nMaxCol = tableSheet.Columns.Count;
            int nMaxRow = tableSheet.Rows.Count;

            try
            {
                //Duyệt row bắt đầu từ vị trí lấy dữ liệu.
                //Do trên DataTable vị trí duyệt bắt đẩu từ index 0 nên - 1.
                //Nếu vị trí duyệt bắt đẩu từ index 1 thì nRowIndex <= nMaxRow.
                for (int nRowIndex = posGetValue - 1; nRowIndex < nMaxRow; nRowIndex++)
                {
                    objTotNghiepTC = new TotNghiepTC();

                    //Duyệt column bắt đầu từ vị trí đầu tiên
                    for (int nColIndex = 0; nColIndex < nMaxCol; nColIndex++)
                    {
                        //Lấy dữ liệu
                        if (tableSheet.Rows[nRowIndex][nColIndex] != null)
                        {
                            //Lấy tên cột tương ứng giữa File Excel & Table Tuyển sinh
                            string columnName = ((Global.TotNghiepTrungCapColumnIndex)nColIndex).ToString();

                            try
                            {
                                UpdateValueTotNghiepTC(objTotNghiepTC, columnName, tableSheet.Rows[nRowIndex][nColIndex]);
                            }
                            catch (Exception ex)
                            {
                                //Lưu thông tin lỗi
                                LogDetail log = new LogDetail();
                                log.ColumnName = columnName;
                                log.RowPosition = nRowIndex + 2;
                                log.Description = "Giá trị lỗi: " + tableSheet.Rows[nRowIndex][nColIndex].ToString() + ". " + ex.Message;
                                logDetails.Add(log);
                            }
                        }
                    }

                    listTotNghiepTC.Add(objTotNghiepTC);
                }
            }
            catch (Exception ex)
            {

            }

            //Xóa các dữ liệu rác, rỗng.
            //listTotNghiepTC = TotNghiepTC.Clean(listTotNghiepTC);

            return listTotNghiepTC;
        }

        /// <summary>
        /// Cập nhật giá trị cho đối tượng Tuyển sinh theo tên thuộc tính
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        private static void UpdateValueTuyenSinh(TuyenSinh obj, string columnName, object value)
        {
            try
            {
                //Thiết lập Culter Vi-vn: lý do vì cột Ngày sinh trong file Excel có định dạng đ/mm/yyyy
                //nên thiết lập định dạng culter vi-vn để chuyển đổi đúng giá trị.
                System.Globalization.CultureInfo culVN = new System.Globalization.CultureInfo("vi-vn");

                //Thiết lập Culter en-us: lý do để chuyển đổi các kiểu số cho đúng. 
                System.Globalization.CultureInfo culEN = new System.Globalization.CultureInfo("en-us");

                switch (columnName)
                {
                    case "SBD":
                        obj.SBD = value != DBNull.Value ? Convert.ToInt32(value, culEN) : 0;
                        break;
                    case "BTS":
                        obj.BTS = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "DonVi":
                        obj.DonVi = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "MHS":
                        obj.MHS = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HoTenLot":
                        obj.HoTenLot = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Ten":
                        obj.Ten = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "NgaySinh":
                        try
                        {
                            obj.NgaySinh = (value != DBNull.Value && value.ToString() != "#VALUE!") ? Convert.ToDateTime(value, culVN.DateTimeFormat) : new DateTime(1753, 1, 1);
                        }
                        catch (Exception ex)
                        {
                            obj.NgaySinh = new DateTime(1753, 1, 1);
                            throw ex;
                        }
                        break;
                    case "GioiTinh":
                        obj.GioiTinh = value != DBNull.Value ? (RemoveAccents(value.ToString()).Equals("Nu") ? false : true) : true;
                        break;
                    case "Tinh":
                        obj.Tinh = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Huyen":
                        obj.Huyen = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "DoiTuong":
                        obj.DoiTuong = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "UuTien":
                        obj.UuTien = value != DBNull.Value ? Convert.ToInt32(value, culEN) : 0;
                        break;
                    case "KhuVuc":
                        obj.KhuVuc = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Mon1"://Toan
                        obj.Mon1 = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "Mon2"://Ly
                        obj.Mon2 = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "Mon3"://Hoa
                        obj.Mon3 = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "Tong":
                        obj.Tong = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "ChuyenNganh":
                        obj.ChuyenNganh = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                }
            }
            catch (Exception ex) { throw ex; }
        }

        /// <summary>
        /// Cập nhật giá trị cho đối tượng Rèn luyện theo tên thuộc tính
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        private static void UpdateValueRenLuyen(RenLuyen obj, string columnName, object value)
        {
            try
            {
                //Thiết lập Culter Vi-vn: lý do vì cột Ngày sinh trong file Excel có định dạng đ/mm/yyyy
                //nên thiết lập định dạng culter vi-vn để chuyển đổi đúng giá trị.
                System.Globalization.CultureInfo culVN = new System.Globalization.CultureInfo("vi-vn");

                //Thiết lập Culter en-us: lý do để chuyển đổi các kiểu số cho đúng. 
                System.Globalization.CultureInfo culEN = new System.Globalization.CultureInfo("en-us");

                switch (columnName)
                {
                    case "MaSV":
                        obj.MaSV = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HoTen":
                        obj.HoTen = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Ten":
                        obj.HoTen += obj.HoTen.Length != 0 ? (" " + (value != DBNull.Value ? Convert.ToString(value) : "")) : "";
                        break;
                    case "Lop":
                        obj.Lop = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "NgaySinh":
                        try
                        {
                            obj.NgaySinh = (value != DBNull.Value && value.ToString() != "#VALUE!") ? Convert.ToDateTime(value, culVN.DateTimeFormat) : new DateTime(1753, 1, 1);
                        }
                        catch (Exception ex)
                        {
                            obj.NgaySinh = new DateTime(1753, 1, 1);
                            throw ex;
                        }
                        //obj.NgaySinh = (value != DBNull.Value && value.ToString() != "#VALUE!") ? Convert.ToDateTime(value, culEN.DateTimeFormat) : new DateTime(1753, 1, 1);
                        break;
                    case "XepLoaiHT":
                        obj.XepLoaiHT = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "YTHT_1":
                        obj.YTHT_1 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "YTHT_2":
                        obj.YTHT_2 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "YTHT_3":
                        obj.YTHT_3 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "CHNQ_1":
                        obj.CHNQ_1 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "CHNQ_2":
                        obj.CHNQ_2 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "CHNQ_3":
                        obj.CHNQ_3 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "CHNQ_4":
                        obj.CHNQ_4 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "TGHDXH":
                        obj.TGHDXH = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "PCCD_1":
                        obj.PCCD_1 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "PCCD_2":
                        obj.PCCD_2 = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "PTLDT":
                        obj.PTLDT = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "DiemTK":
                        obj.DiemTK = value != DBNull.Value ? Convert.ToInt32(value) : 0;
                        break;
                    case "XepLoai":
                        obj.XepLoai = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "GhiChu":
                        obj.GhiChu = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                }
            }
            catch (Exception ex) { throw ex; }
        }

        /// <summary>
        /// Cập nhật giá trị cho đối tượng Học tập theo tên thuộc tính
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        private static void UpdateValueHocTap(KQHocTap obj, string columnName, object value)
        {
            try
            {
                //Thiết lập Culter Vi-vn: lý do vì cột Ngày sinh trong file Excel có định dạng đ/mm/yyyy
                //nên thiết lập định dạng culter vi-vn để chuyển đổi đúng giá trị.
                System.Globalization.CultureInfo culVN = new System.Globalization.CultureInfo("vi-vn");

                //Thiết lập Culter en-us: lý do để chuyển đổi các kiểu số cho đúng. 
                System.Globalization.CultureInfo culEN = new System.Globalization.CultureInfo("en-us");

                switch (columnName)
                {
                    case "MaSV":
                        obj.MaSV = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HoTenLot":
                        obj.HoTenLot = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Ten":
                        obj.Ten = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Lop":
                        obj.Lop = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HT_TBC":
                        obj.HT_TBC = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "HT_XepLoai":
                        obj.HT_XepLoai = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "RL_TDiem":
                        obj.RL_TDiem = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "RL_XepLoai":
                        obj.RL_XepLoai = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Mon1":
                        obj.Mon1 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon2":
                        obj.Mon2 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon3":
                        obj.Mon3 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon4":
                        obj.Mon4 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon5":
                        obj.Mon5 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon6":
                        obj.Mon6 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon7":
                        obj.Mon7 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon8":
                        obj.Mon8 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "Mon9":
                        obj.Mon9 = value != DBNull.Value ? Convert.ToInt32(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "DHTDNH":
                        obj.DHTDNH = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                }
            }
            catch (Exception ex) { throw ex; }
        }

        /// <summary>
        /// Cập nhật giá trị cho đối tượng Tốt nghiệp theo tên thuộc tính
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        private static void UpdateValueTotNghiepCD(TotNghiepCD obj, string columnName, object value)
        {
            try
            {
                //Thiết lập Culter Vi-vn: lý do vì cột Ngày sinh trong file Excel có định dạng đ/mm/yyyy
                //nên thiết lập định dạng culter vi-vn để chuyển đổi đúng giá trị.
                System.Globalization.CultureInfo culVN = new System.Globalization.CultureInfo("vi-vn");

                //Thiết lập Culter en-us: lý do để chuyển đổi các kiểu số cho đúng. 
                System.Globalization.CultureInfo culEN = new System.Globalization.CultureInfo("en-us");

                switch (columnName)
                {
                    case "MaSV":
                        obj.MaSV = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HoTenLot":
                        obj.HoTenLot = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Ten":
                        obj.Ten = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Lop":
                        obj.Lop = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Kyluat":
                        try
                        {
                            obj.Kyluat = (value != DBNull.Value && value.ToString() != "#VALUE!") ? Convert.ToDateTime(value, culVN.DateTimeFormat) : new DateTime(1753, 1, 1);
                        }
                        catch (Exception ex)
                        {
                            obj.Kyluat = new DateTime(1753, 1, 1);
                            throw ex;
                        }
                        break;
                    case "GDQP":
                        obj.GDQP = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "GDTC":
                        obj.GDTC = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "TTHCM":
                        obj.TTHCM = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "MonTNCS":
                        obj.MonTNCS = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "MonTNCN":
                        obj.MonTNCN = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "DTNCTK":
                        obj.DTNCTK = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "TLDVHPThiLai":
                        obj.TLDVHPThiLai = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "CongNhanTN":
                        obj.CongNhanTN = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "XLTN":
                        obj.XLTN = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "GhiChu":
                        obj.GhiChu = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                }
            }
            catch (Exception ex) { throw ex; }
        }

        /// <summary>
        /// Cập nhật giá trị cho đối tượng Tốt nghiệp theo tên thuộc tính
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        private static void UpdateValueTotNghiepTC(TotNghiepTC obj, string columnName, object value)
        {
            try
            {
                //Thiết lập Culter Vi-vn: lý do vì cột Ngày sinh trong file Excel có định dạng đ/mm/yyyy
                //nên thiết lập định dạng culter vi-vn để chuyển đổi đúng giá trị.
                System.Globalization.CultureInfo culVN = new System.Globalization.CultureInfo("vi-vn");

                //Thiết lập Culter en-us: lý do để chuyển đổi các kiểu số cho đúng. 
                System.Globalization.CultureInfo culEN = new System.Globalization.CultureInfo("en-us");

                switch (columnName)
                {
                    case "MaSV":
                        obj.MaSV = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "HoTenLot":
                        obj.HoTenLot = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Ten":
                        obj.Ten = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "Lop":
                        obj.Lop = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "KyLuat":
                        try
                        {
                            obj.KyLuat = (value != DBNull.Value && value.ToString() != "#VALUE!") ? Convert.ToDateTime(value, culVN.DateTimeFormat) : new DateTime(1753, 1, 1);
                        }
                        catch (Exception ex)
                        {
                            obj.KyLuat = new DateTime(1753, 1, 1);
                            throw ex;
                        } break;
                    case "DiemTBCTK":
                        obj.DiemTBCTK = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "MontTN_ChinhTri":
                        obj.MontTN_ChinhTri = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "MonTN_LyThuyet":
                        obj.MonTN_LyThuyet = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0, culEN) : 0;
                        break;
                    case "MonTN_ThucHanh":
                        obj.MonTN_ThucHanh = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "DTB_TotNghiep":
                        obj.DTB_TotNghiep = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "DXL_TotNghiep":
                        obj.DXL_TotNghiep = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "TyLeDVHPTL":
                        obj.TyLeDVHPTL = value != DBNull.Value ? Convert.ToDouble(IsNumber(value) ? value : 0) : 0;
                        break;
                    case "CongNhanTN":
                        obj.CongNhanTN = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "XepLoaiTN":
                        obj.XepLoaiTN = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                    case "GhiChu":
                        obj.GhiChu = value != DBNull.Value ? Convert.ToString(value) : "";
                        break;
                }
            }
            catch (Exception ex) { throw ex; }
        }

        /// <summary>
        /// Kiểm tra điểm tuyển sinh có phải là kiểu số.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private static bool IsNumber(object value)
        {
            bool isValid = false;

            try
            {
                char[] arrChar = value.ToString().ToCharArray();

                for (int i = 0; i < arrChar.Length; i++)
                {
                    if (Char.IsNumber(arrChar[i]))
                    {
                        isValid = true;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                isValid = false;
            }

            return isValid;
        }

        public static string GetTemplateFileName(TraCuuDiemType type)
        {
            string fieName = "";

            switch (type)
            {
                case TraCuuDiemType.DiemTuyenSinh:
                    fieName = "KetQuaTuyenSinh.XLS";
                    break;
                case TraCuuDiemType.DiemTotNghiepCaoDang:
                    fieName = "TotNghiepCD.XLS";
                    break;
                case TraCuuDiemType.DiemTotNghiepTrungCap:
                    fieName = "TotNghiepTC.XLS";
                    break;
                case TraCuuDiemType.KetQuaHocTap:
                    fieName = "KetQuaHocTap.XLS";
                    break;
                case TraCuuDiemType.KetQuaRenLuyen:
                    fieName = "DiemRenLuyen.XLS";
                    break;
            }

            return fieName;
        }

        public static System.Data.DataTable GetTemplateData(TraCuuDiemType type)
        {
            System.Data.DataTable data = new DataTable();

            switch (type)
            {
                case TraCuuDiemType.DiemTuyenSinh:
                    data = TuyenSinh.SelectAll().Tables[0];
                    break;
                case TraCuuDiemType.DiemTotNghiepCaoDang:
                    data = TotNghiepCD.SelectAll().Tables[0];
                    break;
                case TraCuuDiemType.DiemTotNghiepTrungCap:
                    data = TotNghiepTC.SelectAll().Tables[0];
                    break;
                case TraCuuDiemType.KetQuaHocTap:
                    data = KQHocTap.SelectAll().Tables[0];
                    break;
                case TraCuuDiemType.KetQuaRenLuyen:
                    data = RenLuyen.SelectAll().Tables[0];
                    break;
            }

            return data;
        }

        public static ExcelTemplate GetExcelTemplate(TraCuuDiemType type)
        {
            Global.ExcelTemplate template = new Global.ExcelTemplate();
            template.TemplateFolder = @"Templates\CDTM";
            template.ExportFolder = @"Export";
            template.ExportFolderPath = HttpRuntime.AppDomainAppPath + "Export";

            try
            {
                switch (type)
                {
                    case TraCuuDiemType.DiemTuyenSinh:
                        template.TemplateFileName = GetTemplateFileName(type);
                        template.TemplateFileFullPath = HttpRuntime.AppDomainAppPath + template.TemplateFolder + "\\" + template.TemplateFileName;
                        break;
                    case TraCuuDiemType.KetQuaHocTap:
                        template.TemplateFileName = GetTemplateFileName(type);
                        template.TemplateFileFullPath = HttpRuntime.AppDomainAppPath + template.TemplateFolder + "\\" + template.TemplateFileName;
                        break;
                    case TraCuuDiemType.KetQuaRenLuyen:
                        template.TemplateFileName = GetTemplateFileName(type);
                        template.TemplateFileFullPath = HttpRuntime.AppDomainAppPath + template.TemplateFolder + "\\" + template.TemplateFileName;
                        break;
                    case TraCuuDiemType.DiemTotNghiepCaoDang:
                        template.TemplateFileName = GetTemplateFileName(type);
                        template.TemplateFileFullPath = HttpRuntime.AppDomainAppPath + template.TemplateFolder + "\\" + template.TemplateFileName;
                        break;
                    case TraCuuDiemType.DiemTotNghiepTrungCap:
                        template.TemplateFileName = GetTemplateFileName(type);
                        template.TemplateFileFullPath = HttpRuntime.AppDomainAppPath + template.TemplateFolder + "\\" + template.TemplateFileName;
                        break;
                }
            }
            catch (Exception ex) { throw ex; }

            return template;
        }

    }
}
